home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
301_400
/
DISK0353
/
DISK0353.ZIP
/
MAKAMOVI.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-09-15
|
26KB
|
833 lines
{ (c) 1984 by Neil J. Rubenking }
program MakeAMovie;
type
ScreenLoc = record
character : char;
attribute : byte;
end;
DefinedLoc = record
data : ScreenLoc;
c,r : byte;
end;
OneLine = array[1..80] of ScreenLoc;
Screen = array[1..25] of OneLine;
ScreenSet = ^node;
node = record
AScreen : Screen;
next : ScreenSet;
end;
DiffFil = file of DefinedLoc;
FileNameType = string[14];
var
ScreenSeg, wait : integer;
ScreenItself : Screen absolute $B000:$0000;
ColorScreen : Screen absolute $B800:$0000;
TempScreen, MenuScreen,
LastScreen : Screen;
Screens, Pointer, temp,
EndPointer : ScreenSet;
ScreenNum : byte;
col, row, N, P : byte;
DiffFile : DiffFil;
filename : FileNameType;
exists, color, First,OK : boolean;
choice, EscChoice : char;
BlankLine, HighLine : OneLine;
EndLoc : DefinedLoc;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure twitter(note:integer);
var
N : byte;
begin
for N := 1 to 10 do
begin
sound(note);
delay(50);
sound(note*2);
delay(50);
end;
nosound;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure GetKeys(var C, D:char);
begin
D := chr(0);
repeat until keypressed;
read(Kbd,C);
if keypressed then read(Kbd,D);
end;
{============================================================================}
function ReadScreen(col,row:byte):char;
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
ReadScreen := chr(Mem[ScreenSeg:LocationCode]);
end;
{============================================================================}
procedure WriteScrn(col, row: byte; thisChar:char);
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
Mem[ScreenSeg:locationCode] := ord(ThisChar);
end;
{============================================================================}
procedure ScreenAttribute(col, row, attribute: byte);
var
LocationCode : integer;
begin
LocationCode := (col-1)*2+1 + (row-1)*160;
Mem[ScreenSeg:locationCode] := attribute;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure MakeScreen; forward;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure ReverseOn;
begin
TextColor(lightBlue);
TextBackground(white);
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure ReverseOff;
begin
TextColor(white);
TextBackground(black);
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure AttemptReset(var ThisFile : DiffFil);
begin
{$I-}
reset(ThisFile);
{$I+}
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
function different(var C,D:screenLoc):boolean;
begin
different := (C.character <> D.character) or
(C.attribute <> D.attribute);
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure ShowLocation;
var
SaveX,SaveY : byte;
begin
WriteScrn(54,1,chr((WhereX div 10)+48));
WriteScrn(55,1,chr((WhereX mod 10)+48));
WriteScrn(61,1,chr((WhereY div 10)+48));
WriteScrn(62,1,chr((WhereY mod 10)+48));
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure DisposeAll(var List:ScreenSet);
begin
if List <> nil then
begin
DisposeAll(list^.next);
Dispose(list);
end;
List := nil;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure EditAScreen(operation : char);
var
last : boolean;
TheWord : string[12];
count : byte;
{========================================================================}
procedure ShowIt;
begin
ScreenItself := Pointer^.AScreen;
ColorScreen := Pointer^.AScreen;
ScreenItself[1] := HighLine;
ColorScreen[1] := HighLine;
GotoXY(1,1);
ReverseOn;
Write('Press ',chr(26),' to page thru , <return> to select,');
Write(' <Esc> to exit. Screen # ',count);
ReverseOff;
end;
{========================================================================}
begin
case operation of
'e': TheWord := 'edit';
'r': TheWord := 'remove';
'i': TheWord := 'insert';
end;
ClrScr;
GotoXY(10,18);
Write('Page through the screens by pressing the right arrow key.');
GotoXY(10,19);
Write('When you get to the one');
if operation = 'i' then write(' after which');
Write(' you want to ',TheWord,' press <return>.');
GotoXY(10,20);
Write('To quit without ',Theword,'ing, press <Esc> or page past the end.');
GotoXY(10,21);
Write('Now press a key . . .');
repeat until keypressed;
Pointer := Screens;
last := False;
ShowIt;
count := 1;
repeat
GetKeys(choice,EscChoice);
if (choice = chr(27)) and (EscChoice = 'M') then
begin
Pointer := Pointer^.next;
count := count + 1;
if Pointer <> nil then ShowIt else
begin
last := true;
count := 0;
end;
end;
if (choice = chr(13)) and (not last) then
begin
case operation of
'e': begin
MakeScreen;
tempScreen[1] := BlankLine;
Pointer^.AScreen := tempScreen;
last := true;
end;
'r': begin
if Pointer^.next = nil then Pointer := nil
else
begin
Pointer^.AScreen := Pointer^.next^.AScreen;
Pointer^.next := Pointer^.next^.next;
end;
last := true;
ScreenNum := ScreenNum - 1;
end;
'i': begin
MakeScreen;
TempScreen[1] := BlankLine;
new(temp);
temp^.AScreen := tempScreen;
temp^.next := Pointer^.next;
Pointer^.next := temp;
last := true;
ScreenNum := ScreenNum + 1;
count := count + 1;
end;
end; {case}
end; {if <return> pressed}
until ((choice = chr(27)) and (EscChoice = chr(0))) or last;
if count > 0 then
begin
ScreenItself[1] := HighLine;
ColorScreen [1] := HighLine;
GotoXY(1,1);
Write('Screen #',count,' has been ',Theword,'ed.');
twitter(500);twitter(1000);
end;
ScreenItself := MenuScreen;
ColorScreen := MenuScreen;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure SaveAllScreens;
var
LastScreen : Screen;
tempo : DefinedLoc;
{===============================================}
procedure DiffWrite(var A,B:screen);
begin
for row := 1 to 25 do
begin
for col := 1 to 80 do
begin
if different(A[row][col],B[row][col]) then
begin
with tempo do
begin
data := A[row][col];
r := row;
c := col;
end;
write(DiffFile,tempo);
end;
end;
end;
write(DiffFile,EndLoc);
end;
{===============================================}
procedure DoWrite(var list:ScreenSet);
begin
while list <> nil do
begin
DiffWrite(list^.AScreen, LastScreen);
LastScreen := list^.AScreen;
list := list^.next;
end;
end;
{===============================================}
begin
for row := 1 to 25 do
for col := 1 to 80 do
with LastScreen[row][col] do
begin
character := ' ';
attribute := 15;
end;
ClrScr;
GotoXY(20,20);
Write('Name of Screen file? (omit extension!) ');
read(fileName);
P := pos('.',filename);
if P <> 0 then delete(filename,P,length(filename)-P+1);
filename := filename + '.scn';
Assign(DiffFile,filename);
WriteLn;
exists := false;
AttemptReset(DiffFile);
exists := (IOResult = 0);
if exists then
begin
choice := 'N';
Write(filename,' already exists. OverWrite? ');
read(choice);
end;
if (not exists) or (UpCase(choice) = 'Y') then
begin
ReWrite(DiffFile);
Pointer := Screens;
DoWrite(Pointer);
end;
close(DiffFile);
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure AddScreen(ScreenToAdd:Screen);
begin
ScreentoAdd[1] := BlankLine;
if First then
begin
new(Screens);
Screens^.AScreen := ScreenToAdd;
Screens^.next := nil;
EndPointer := Screens;
ScreenNum := 1;
First := false;
end
else
begin
new(EndPointer^.next);
EndPointer := EndPointer^.next;
EndPointer^.AScreen := ScreenToAdd;
EndPointer^.next := nil;
ScreenNum := ScreenNum + 1;
end;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure ReadScreenFile(TheName:FileNameType);
var
diff : DefinedLoc;
begin
for row := 1 to 25 do
for col := 1 to 80 do
with LastScreen[row][col] do
begin
character := ' ';
attribute := 15;
end;
Assign(DiffFile,TheName);
WriteLn;
AttemptReset(DiffFile);
if (IOResult = 0) and (FileSize(DiffFile) > 0) then
begin
ScreenNum := 0;
First := true;
DisposeAll(Screens);
While not EOF(DiffFile) do
begin
read(DiffFile,diff);
if different(diff.data,EndLoc.data) then
LastScreen[diff.r][diff.c] := diff.data
else
AddScreen(LastScreen);
end; {while}
end {if}
else
OK := false;
close(DiffFile);
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure GetReadyScreenFile;
begin
ClrScr;
GotoXY(20,20);
Write('Name of Screen file? (omit extension!) ');
read(fileName);
WriteLn;
P := pos('.',filename);
if P <> 0 then delete(filename,P,length(filename)-P+1);
filename := filename + '.scn';
OK := true;
ReadScreenFile(filename);
if not OK then write('Not found.');
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure MakeScreen;
var
choice1, EscChoice : char;
SaveX, SaveY : byte;
{================================================}
procedure GoUp;
begin
if WhereY > 2 then GotoXY(WhereX,WhereY-1);
end;
{================================================}
procedure GoDown;
begin
if WhereY < 25 then GotoXY(WhereX,WhereY+1);
end;
{================================================}
procedure GoLeft;
begin
if WhereX > 1 then GotoXY(WhereX-1,WhereY);
end;
{================================================}
procedure GoRight;
begin
if WhereX < 80 then GotoXY(WhereX+1,WhereY);
end;
{================================================}
procedure LineDraw;
var
LastDir, ThisDir : char;
choice1,EscChoice : char;
nups,ndowns,nlefts,nrights,allchars : set of char;
ups,downs,lefts,rights : set of char;
draw : boolean;
{----------------------------------------------------}
function RightChar(ThisDir,LastDir:char):char;
var
temp : char;
{- - - - - - - - - - - - - - - - - - - - - - - - -}
function combine(A,B:char):char;
var
tempset : set of char;
temp, C : char;
begin
if A = B then temp := A
else if A = ' ' then temp := B
else
begin
tempset := allchars;
if (A in ups) or (B in ups) then
tempset := tempset - nups;
if (A in Nups) and (B in Nups) then
tempset := tempset - ups;
if (A in downs) or (B in downs) then
tempset := tempset - ndowns;
if (A in Ndowns) and (B in Ndowns) then
tempset := tempset - downs;
if (A in lefts) or (B in lefts) then
tempset := tempset - nlefts;
if (A in Nlefts) and (B in Nlefts) then
tempset := tempset - lefts;
if (A in rights) or (B in rights) then
tempset := tempset - nrights;
if (A in Nrights) and (B in Nrights) then
tempset := tempset - rights;
for C := '╣' to '╬' do if C in tempset then temp := C;
end;
combine := temp;
end;
{- - - - - - - - - - - - - - - - - - - - - - - - -}
begin
case LastDir of
'H': case ThisDir of
'H': temp := '║';
'K': temp := '╗';
'M': temp := '╔';
'P': temp := ' ';
end;
'K': case ThisDir of
'H': temp := '╚';
'K': temp := '═';
'M': temp := ' ';
'P': temp := '╔';
end;
'M': case ThisDir of
'H': temp := '╝';
'K': temp := ' ';
'M': temp := '═';
'P': temp := '╗';
end;
'P': case ThisDir of
'H': temp := ' ';
'K': temp := '╝';
'M': temp := '╚';
'P': temp := '║';
end;
end; {case}
if ReadScreen(WhereX,WhereY) in AllChars then
RightChar := Combine(temp,ReadScreen(WhereX,WhereY))
else RightChar := temp;
end;
{----------------------------------------------------}
begin
AllChars := ['╣','║','╗','╝','╚','╔','╩','╦','╠','═','╬'];
nups := ['╗','╔','╦','═'];
ndowns := ['╝','╚','╩','═'];
nlefts := ['║','╚','╔','╠'];
nrights := ['╣','║','╗','╝'];
ups := AllChars - nups;
downs := AllChars - ndowns;
rights := AllChars - nrights;
lefts := Allchars - nlefts;
draw := false;
ReverseOn;
SaveX := WhereX; SaveY := WhereY;
GotoXY(1,1);
Write('[Esc] = back to plain draw F2 toggles line col row');
GotoXY(SaveX,SaveY);
ReverseOff;
ShowLocation;
LastDir := '<';
repeat
GetKeys(choice1,EscChoice);
if EscChoice in ['H','K','M','P','<','ä','s','t','u','v','w'] then
begin
if EscChoice = '<' then draw := not(draw);
if draw then WriteScrn(WhereX,WhereY,RightChar(EscChoice,LastDir));
LastDir := EscChoice;
case EscChoice of
'H': GoUp; 'ä': if not draw then GotoXY(WhereX,2);
'K': GoLeft; 's': if not draw then GotoXY(1,WhereY);
'M': GoRight; 't': if not draw then GotoXY(80,WhereY);
'P': GoDown; 'v': if not draw then GotoXY(WhereX,25);
'w': if not draw then GotoXY(1,2);
'u': if not draw then GotoXY(80,25);
end;
ShowLocation;
end;
until (choice1 = chr(27)) and (EscChoice = chr(0));
ReverseOn;
SaveX := WhereX;
SaveY := WhereY;
GotoXY(1,1);
Write('F1 = block draw F2 line draw col row');
ReverseOff;
GotoXY(SaveX,SaveY);
end;
{================================================}
procedure BlockDraw;
var
choice1,EscChoice : char;
N,M : byte;
{------------------------------------------------------------}
procedure TEN(C:char);
begin
M := 80 - WhereX;
if M > 10 then M := 10;
if M > 0 then
for N := 1 to M do write(C);
end;
{------------------------------------------------------------}
procedure FIVE(C:char);
begin
M := 25 - WhereY;
if M > 5 then M := 5;
if M > 0 then for N := WhereY to WhereY + M do
begin
GotoXY(WhereX, N);
write(C);write(chr(8));
end;
end;
{------------------------------------------------------------}
begin
ColorScreen[1] := HighLine;
ScreenItself[1] := HighLine;
ReverseOn;
SaveX := WhereX;
SaveY := WhereY;
GotoXY(1,1);
Write('F1░ F2▒ F3▓ F4█ F5▄ F6▀ F7▌ F8▐ F9■ F10{space} col row');
ReverseOff;
GotoXY(SaveX,SaveY);
ShowLocation;
repeat
GetKeys(choice1,EscChoice);
Case EscChoice of
'G': begin GoUp;GoLeft;end; ';': write('░'); 'T': TEN('░');
'H': GoUp; '<': write('▒'); 'U': TEN('▒');
'I': begin GoUp;GoRight;end; '=': write('▓'); 'V': TEN('▓');
'K': GoLeft; '>': write('█'); 'W': TEN('█');
'M': GoRight; '?': write('▄'); 'X': TEN('▄');
'O': begin GoDown;GoLeft;end; '@': write('▀'); 'Y': TEN('▀');
'P': GoDown; 'A': write('▌'); 'Z': TEN('▌');
'Q': begin;GoDown;GoRight;end; 'B': write('▐'); '[': TEN('▐');
'ä': GotoXY(WhereX,2); 'C': write('■'); '/': TEN('■');
's': GotoXY(1,WhereY); 'D': write(' '); ']': TEN(' ');
't': GotoXY(80,WhereY); 'h': FIVE('░'); 'm': FIVE('▀');
'v': GotoXY(WhereX,25); 'i': FIVE('▒'); 'n': FIVE('▌');
'w': GotoXY(1,2); 'j': FIVE('▓'); 'o': FIVE('▐');
'u': GotoXY(80,25); 'k': FIVE('█'); 'p': FIVE('■');
'l': FIVE('▄'); 'q': FIVE(' ');
end; {case}
ShowLocation;
until (choice1 = chr(27)) and (EscChoice = chr(0));
ColorScreen[1] := HighLine;
ScreenItself[1] := HighLine;
ReverseOn;
SaveX := WhereX; SaveY := WhereY;
GotoXY(1,1);
Write('F1 = block draw F2 line draw col row');
ReverseOff;
GotoXY(SaveX,SaveY);
end;
{================================================}
begin
ColorScreen[1] := HighLine;
ScreenItself[1] := HighLine;
ReverseOn;
GotoXY(1,1);
Write('F1 = block draw F2 line draw col row');
ReverseOff;
GotoXY(40,20);
ShowLocation;
repeat
GetKeys(choice1,EscChoice);
Case EscChoice of
'G': begin GoUp;GoLeft;end; 'w': GotoXY(1,2);
'H': GoUp;
'I': begin GoUp;GoRight;end; 'ä': GotoXY(WhereX,2);
'K': GoLeft; 's': GotoXY(1,WhereY);
'M': GoRight; 't': GotoXY(80,WhereY);
'O': begin GoDown;GoLeft;end; 'u': GotoXY(80,25);
'P': GoDown;
'Q': begin;GoDown;GoRight;end; 'v': GotoXY(WhereX,25);
';': BlockDraw;
'<': LineDraw;
'C': begin; WriteScrn(WhereX,WhereY,chr(27)); GoRight; end;
'D': begin; WriteScrn(WhereX,WhereY,chr(3)) ; GoRight; end;
else
case ord(choice1) of
3:;{chr(3) = ^C, so this will not come up}
8: begin; GoLeft; WriteScrn(WhereX,WhereY,' ');end;
27:;{chr(27) = Esc, so entering it will exit draw mode}
else
WriteScrn(WhereX,WhereY,choice1);
GoRight;
end; {inner case}
end; {case}
ShowLocation;
until (choice1 = chr(27)) and (EscChoice = chr(0));
if color then tempScreen := ColorScreen
else tempScreen := screenItself;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure SeeScreen;
var
Number, count : byte;
begin
ClrScr;
GotoXY(20,20);
number := ScreenNum;
Write('There are ',ScreenNum,' screens. Which #? ');
GotoXY(20,21);
write('(Just <enter> for latest screen)');
read(Number);
if (Number > 0) and (Number <= ScreenNum) then
begin
Pointer := Screens;
count := 1;
while count < Number do
begin
if Pointer^.next <> nil then Pointer := Pointer^.next;
count := count + 1;
end;
ScreenItself := Pointer^.AScreen;
ColorScreen := Pointer^.AScreen;
end
else
begin
ScreenItself := TempScreen;
ColorScreen := TempScreen;
end;
MakeScreen;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure DoPlay(var list:ScreenSet;wait:integer);
begin
ScreenItself := list^.AScreen;
ColorScreen := list^.AScreen;
delay(wait);
list := list^.next
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure PlayScreens;
begin
GotoXY(32,20);
Write('How much wait between? ');
read(wait);
Pointer := Screens;
GotoXY(1,1);
While Pointer <> nil do DoPlay(Pointer,wait);
ColorScreen[1] := HighLine;
ScreenItself[1] := HighLine;
ReverseOn;
GotoXY(1,1);
write('Press a key to continue . . .');
repeat until keypressed;
ReverseOff;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure CycleScreens;
begin
GotoXY(32,22);
Write('How much wait between? ');
read(wait);
GotoXY(1,1);
repeat
Pointer := Screens;
While Pointer <> nil do DoPlay(Pointer,wait);
until keypressed;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure FinishUp;
var
choice : char;
begin
if color then tempScreen := ColorScreen
else TempScreen := ScreenItself;
ClrScr;
GotoXY(20,20);
Write('Are you sure you want to quit? ');
GotoXY(20,21);
Write('If you didn`t save your work yet, just say "N".');
repeat until keypressed;
read(Kbd,choice);
if UpCase(choice) = 'Y' then halt
else
begin
ScreenItself := TempScreen;
ColorScreen := TempScreen;
end;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure MakeMenuScreen;
var
MenuLines : array[1..11] of string[40];
begin
MenuLines[1] := 'F1 CREATE a screen ';
MenuLines[2] := 'F2 ADD a screen to the list ';
MenuLines[3] := 'F3 REMOVE a screen from the list ';
MenuLines[4] := 'F4 INSERT a screen into the list ';
MenuLines[5] := 'F5 EDIT any screen in the list ';
MenuLines[6] := 'F6 RE-USE a screen ';
MenuLines[7] := 'F7 WRITE the list to a file ';
MenuLines[8] := 'F8 READ a file into a new list ';
MenuLines[9] := 'F9 PLAY the current list ';
MenuLines[10] := 'F10 CYCLE thru current screens ';
MenuLines[11] := 'ESCAPE always gets you out! ';
for row := 1 to 25 do MenuScreen[row] := BlankLine;
for row := 1 to 11 do
begin
for col := 21 to 60 do
begin
MenuScreen[2*row+2][col].character := MenuLines[row][col-20];
if (col in [21,22,25..30]) and (row < 11)
then MenuScreen[2*row+2][col].attribute := 112
else MenuScreen[2*row+2][col].attribute := 15;
end;
end;
MenuScreen[22][23].attribute := 112;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure MainMenu;
var
filler, choice : char;
begin
ScreenItself := MenuScreen;
ColorScreen := MenuScreen;
repeat
GetKeys(filler,choice);
if (filler = chr(27)) and (choice = chr(0)) then FinishUp;
until choice in [';','<','=','>','?','@','A','B','C','D'];
case choice of
';': begin
ClrScr;
MakeScreen;
end;
'<': begin
AddScreen(tempScreen);
GotoXY(25,6);
Write('ADDed screen # ',ScreenNum,'. ');
twitter(500);
end;
'=': EditAScreen('r');
'>': EditAScreen('i');
'?': EditAScreen('e');
'@': SeeScreen;
'A': SaveAllScreens;
'B': GetReadyScreenFile;
'C': PlayScreens;
'D': CycleScreens;
end;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure initialize;
begin
First := true;
if (Mem[0000:1040] and 48) <> 48 then
begin
ScreenSeg := $B800;
color := true;
end
else
begin
ScreenSeg := $B000;
color := false;
end;
ScreenNum := 0;
Screens := nil;
for N := 1 to 80 do
begin
BlankLine[N].character := ' ';
BlankLine[N].attribute := 15;
HighLine[N].character := ' ';
HighLine[N].attribute := 9;
end;
MakeMenuScreen;
with EndLoc do
begin
data.character := chr(0);
data.attribute := 0;
r := 0; c := 0;
end;
filename := '';
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
procedure IntroMovie;
begin
OK := true;
filename := 'intro.scn';
ReadScreenFile(filename);
if OK then
begin
Twitter(500);Twitter(1000);Twitter(1500);
Pointer := Screens;
wait := 50;
While Pointer <> nil do DoPlay(Pointer,wait);
ColorScreen[1] := HighLine;
ScreenItself[1] := HighLine;
ReverseOn;
GotoXY(1,1);
write('Press a key to continue . . .');
repeat until keypressed;
ReverseOff;
DisposeAll(Screens);
ScreenNum := 0;
First := true;
end;
end;
{≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡}
begin
initialize;
IntroMovie;
repeat MainMenu until false;
ClrScr;
end.